#ifndef DATASTRUCTURE_LINKEDLIST_H
#define DATASTRUCTURE_LINKEDLIST_H

typedef char ElemType;

/*
 * 双向链表
 */
typedef struct Node {
    ElemType data;
    // 直接前驱节点
    struct Node *prev;
    // 直接后继节点
    struct Node *next;
} LinkedList;

LinkedList *createNode(ElemType e);

int verificationLinkedList(LinkedList *linkedList);

// 初始化双向链表
LinkedList *initLinkedList();

// 添加元素
int addLinkedList(LinkedList *linkedList, ElemType e);

// 添加链表
int addAllLinkedList(LinkedList *linkedList, LinkedList *ll);

// 删除第i个节点数据
int deleteIndexLinkedList(LinkedList *linkedList, int index);

// 输出双向链表
void showLinkedList(LinkedList *linkedList);

// 获取第i个节点
LinkedList *getLinkedListByIndex(LinkedList *linkedList, int index);

// 双向链表表长度
int linkedListLength(LinkedList *linkedList);

// 判断双向链表是否为空
int isEmptyLinkedList(LinkedList *linkedList);

// 输出双向链表给定位置的元素
ElemType getElemTypeLinkedList(LinkedList *linkedList, int index);

// 查找元素的位置
int getIndexLinkedList(LinkedList *linkedList, ElemType e);

// 在固定位置插入元素
int addIndexLinkedList(LinkedList *linkedList, int index, ElemType e);

// 释放内存
void deleteLinkedList(LinkedList *linkedList);

void linkedListTest();

#endif //DATASTRUCTURE_LINKEDLIST_H
